home *** CD-ROM | disk | FTP | other *** search
/ Megahits 3 / Megahits 3 (1994)(GTI - Rhein-Main-Soft)(DE)[!].iso / module / utilities / midi / k1_ii_ed532.lha / Sources / funcs.c < prev    next >
C/C++ Source or Header  |  1993-06-27  |  29KB  |  1,157 lines

  1. #include <exec/memory.h>
  2. #include "inc.h"
  3. #include "defs.h"
  4. #include "req_manx_5.c"
  5. #include "zz_pointer.h"
  6. #include <exec/semaphores.h>
  7.  
  8. #include <devicetoolkits/input.h>
  9. #include <deviceToolKits/proto/Input.h>
  10. #include <deviceToolKits/InputBase.h>
  11.  
  12. extern DTInput_t            Unit0;
  13. extern struct   Interrupt   handler_setup;
  14. extern struct Library *SysBase;
  15.  
  16. struct SignalSemaphore *Semaphore;
  17.  
  18.  
  19. /* funcs.c */
  20.  
  21. void Error(char *string);
  22. int OpenSingleRequester(int xp, int yp);
  23. int OpenMultiRequester(int xp, int yp);
  24. void OpenStuff(void);
  25. void CloseStuff(void);
  26. int WaitForK1(void);
  27. long FileLen(FILE *fp);
  28. void LoadBank(int banknr);
  29. void SaveBank(int banknr);
  30. void SaveSound(int soundnr);
  31. void LoadSound(int soundnr);
  32. void SaveAllSounds(int banknr);
  33. void TransmitCurrentBank(int banknr);
  34. void TransmitBank(int banknr);
  35. void TransmitSingleSound(int soundnr);
  36. void GetBank(int banknr);
  37. void LoadMulti(void);
  38. void SaveMulti(void);
  39. void SendDump(void);
  40. void GetDump(void);
  41. void TransmitSingleMulti(int soundnr);
  42. void LoadDump(char *dumpname);
  43. void SaveDump(void);
  44. void Display(void);
  45. void GetMulti(void);
  46. void SendMulti(void);
  47. void ProgChange(int);
  48. void AllNotesOff(void);            
  49. void NoteOff(int note,int channel);
  50. void NoteOn(int note,int vel,int channel);
  51. BOOL Exists(char *);
  52. char *filerequester(char *dir,char *filename,char *title);
  53.  
  54. /**********************************************************************************/
  55. /***                                                                            ***/
  56. /**********************************************************************************/
  57.  
  58. void Error(char *string)
  59. {
  60.     if (ReqBase == NULL) BoolRequest(string,"Quit","Quit");
  61.                     else MyReq(string,NULL," Ok ");
  62.     CloseStuff();
  63. }
  64.  
  65. /**********************************************************************************/
  66. /***                                                                            ***/
  67. /**********************************************************************************/
  68.  
  69. int OpenSingleRequester(int xp,int yp)
  70. {
  71.     int i,select;
  72.  
  73.     if (yp+win->TopEdge-10+52 > HOEHE-10) 
  74.     {
  75.         MoveWindow(win,-(win->LeftEdge),-(win->TopEdge));
  76.         return(-1);
  77.     }
  78.     
  79.     if (!(xp<15 || xp>615 || yp<28 || yp>189))
  80.     {
  81.         if (xp>480) xp=480;
  82.         if (yp>180) yp=180;
  83.         Make_SingleReqWindow(xp-10,yp+8);
  84.         SetAPen(rp2,1);
  85.         for (i=11;i<70;i+=10)    Line(win2,1,i,win2->Width-1,i);
  86.         MyCenter(win2,9, "Edit sound");
  87.         MyCenter(win2,19,"Load sound");
  88.         MyCenter(win2,29,"Save sound");
  89.         MyCenter(win2,39,"Transmit sound");
  90.         MyCenter(win2,49,"Copy to");
  91.         MyCenter(win2,59,"Swap with");
  92.         MyCenter(win2,69,"Cancel");
  93.  
  94. Loop:    ;
  95.         WaitPort(win2->UserPort);
  96.         while(mesg=(struct IntuiMessage *) GetMsg(win2->UserPort))
  97.         {
  98.             if (mesg->Class == MOUSEBUTTONS && mesg->Code == SELECTDOWN)
  99.             {    
  100.                 select=(mesg->MouseY)/10;
  101.                 ReplyMsg((struct Message *) mesg);
  102.                 Delay(5);
  103.                 WaitPort(win2->UserPort);
  104.                 CloseWindow(win2);
  105.                 goto Ende;
  106.             }
  107.             else 
  108.             {    
  109.                 ReplyMsg((struct Message *) mesg);
  110.                 goto Loop;
  111.             }
  112.         }
  113.     }    
  114.     Ende: return(select);
  115. }
  116.  
  117. /**********************************************************************************/
  118. /***                                                                            ***/
  119. /**********************************************************************************/
  120.  
  121. int OpenMultiRequester(int xp,int yp)
  122. {
  123.     int i,select;
  124.  
  125.     if (yp+win->TopEdge-10+52 > HOEHE-10) 
  126.     {
  127.         MoveWindow(win,-(win->LeftEdge),-(win->TopEdge));
  128.         return(-1);
  129.     }
  130.     
  131.     if (!(xp<15 || xp>315 || yp<28 || yp>189))
  132.     {
  133.         if (xp>480) xp=480;
  134.         if (yp>180) yp=180;
  135.         Make_MultiReqWindow(xp-10,yp+8);
  136.         SetAPen(rp6,1);
  137.         for (i=11;i<50;i+=10)    Line(win6,1,i,win6->Width-1,i);
  138.         MyCenter(win6,9,"Edit multi");
  139.         MyCenter(win6,19,"Transmit multi");
  140.         MyCenter(win6,29,"Copy to");
  141.         MyCenter(win6,39,"Swap with");
  142.         MyCenter(win6,49,"Cancel");
  143.  
  144. Loop:    ;
  145.         WaitPort(win6->UserPort);
  146.         while(mesg=(struct IntuiMessage *) GetMsg(win6->UserPort))
  147.         {
  148.             if (mesg->Class == MOUSEBUTTONS && mesg->Code == SELECTDOWN)
  149.             {    
  150.                 select=(mesg->MouseY)/10;
  151.                 ReplyMsg((struct Message *) mesg);
  152.                 Delay(5);
  153.                 WaitPort(win6->UserPort);
  154.                 CloseWindow(win6);
  155.                 goto Ende;
  156.             }
  157.             else 
  158.             {    
  159.                 ReplyMsg((struct Message *) mesg);
  160.                 goto Loop;
  161.             }
  162.         }
  163.     }    
  164.     Ende: return(select);
  165. }
  166.  
  167. /**********************************************************************************/
  168. /***                                                                            ***/
  169. /**********************************************************************************/
  170.  
  171. void OpenStuff(void)
  172. {
  173.     IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",0);
  174.     if (IntuitionBase==NULL)     Error("Can't open intuition.library");
  175.     if (IntuitionBase->LibNode.lib_Version >=37) KICKZWO=TRUE;
  176.  
  177.     ReqBase=(struct ReqBase *)     OpenLibrary("req.library",REQVERSION);
  178.     if (ReqBase==NULL)             Error("Can't open req.library, I need version 2.5 or higher");
  179.  
  180.     GfxBase=(struct GfxBase *)     OpenLibrary("graphics.library",0);
  181.     if (GfxBase==NULL)             Error("Can't open graphics.library");
  182.  
  183.     DosBase=(struct DosBase *)     OpenLibrary("dos.library",0);
  184.     if (DosBase==NULL)             Error("Can't open dos.library");
  185.  
  186.     MidiBase=(struct MidiBase *) OpenLibrary(MIDINAME,MIDIVERSION);
  187.     if (MidiBase==NULL)         Error("Can't open midi.library");
  188.  
  189.     DiskfontBase=(struct DiskfontBase *) OpenLibrary("diskfont.library",0);
  190.     if (DiskfontBase==NULL)     Error("Can't open diskfont.library");
  191.  
  192.     IconBase=(struct IconBase *) OpenLibrary("icon.library",0);
  193.     if (IconBase==NULL)            Error("Can't open icon.library");    
  194.  
  195.     source=CreateMSource(NULL,NULL);
  196.     if (source==NULL)             Error("Can't create midi source");
  197.  
  198.     dest=CreateMDest(NULL,NULL);
  199.     if (dest==NULL)             Error("Can't create midi destination");
  200.  
  201.     inroute=MRouteDest("MidiIn",dest,&routeinfo);
  202.     if (inroute==NULL)             Error("Can't create midi route destination");
  203.  
  204.     outroute=MRouteSource(source,"MidiOut",NULL);
  205.     if (outroute == NULL)         Error("Can't create midi route source");
  206.  
  207.     if (!zz_pointer_open())        Error("Can't get sleepy pointer");
  208.  
  209.     if (SysBase->lib_Version>=37) KICKZWO=TRUE;
  210.  
  211.  
  212.     Semaphore=(struct SignalSemaphore *) AllocVec(sizeof(struct SignalSemaphore),MEMF_PUBLIC | MEMF_CLEAR);
  213.  
  214.     Semaphore->ss_Link.ln_Pri=0;
  215.     Semaphore->ss_Link.ln_Name="K1-II Editor";
  216.     AddSemaphore(Semaphore);
  217. }
  218.  
  219. /**********************************************************************************/
  220. /***                                                                            ***/
  221. /**********************************************************************************/
  222.     
  223. void CloseStuff(void)
  224. {
  225.     SetTaskPri(FindTask(NULL),0);
  226.     setenv("K1-LIB","FALSE");
  227.  
  228.     Forbid();
  229.         RemSemaphore(Semaphore);
  230.         ObtainSemaphore(Semaphore);
  231.         ReleaseSemaphore(Semaphore);
  232.         FreeVec(Semaphore);
  233.     Permit();
  234.  
  235.  
  236.     myprocess->pr_WindowPtr = olderrorwindow;
  237.         
  238.     DTInputRemHandler(Unit0,&handler_setup);
  239.     DTInputFree(Unit0);
  240.  
  241.     if (inroute != NULL)        DeleteMRoute(inroute);
  242.     if (outroute != NULL)        DeleteMRoute(outroute);
  243.     if (source != NULL)            DeleteMSource(source);
  244.     if (dest != NULL)            DeleteMDest(dest);
  245.     if (textfont != NULL)        CloseFont(textfont);
  246.  
  247.     if (win != NULL)             CloseWindow(win);
  248.     if (SCREEN != NULL)         CloseScreen(scr);
  249.     if (IntuitionBase != NULL)    CloseLibrary(IntuitionBase);
  250.     
  251.     if (GfxBase != NULL)        CloseLibrary(GfxBase);
  252.     if (MidiBase != NULL)        CloseLibrary(MidiBase);
  253.     if (DosBase != NULL)        CloseLibrary(DosBase);
  254.     if (DiskfontBase != NULL)    CloseLibrary(DiskfontBase);
  255.     if (IconBase != NULL)        CloseLibrary(IconBase);
  256.     if (ReqBase != NULL)    
  257.     {
  258.                                 PurgeFiles(&ReqStruct);
  259.                                 CloseLibrary(ReqBase);
  260.     }
  261.  
  262.     if (SCREEN == NULL)            SetOldColours();
  263.     exit(0);
  264. }
  265.  
  266. /**********************************************************************************/
  267. /***     Test ob K1 überhaupt vorhanden ist (während des Programmablaufs)       ***/
  268. /**********************************************************************************/
  269.  
  270. int  WaitForK1(void)
  271. {
  272.     unsigned char buf[5];
  273.     int i,j;
  274.  
  275.     SetTitle("Waiting....");
  276.     for (j=0;j<=1;j++)
  277.     {
  278.         for (i=0;i<=15;i++)
  279.         {
  280.             buf[0]=0xf0;    buf[1]=0x40;    buf[2]=i;
  281.             buf[3]=0x60;    buf[4]=0xf7;
  282.             PutMidiMsg(source,buf);
  283.             Delay(2);
  284.     
  285.             while(packet=GetMidiPacket(dest))
  286.             {
  287.                 if (packet->MidiMsg[OFFS_FUNC]==K1_MIA)
  288.                 {
  289.                     MASTERCHANNEL=i;
  290.                     return(i);
  291.                 }
  292.                 FreeMidiPacket(packet);
  293.             }
  294.         }
  295.     }
  296.     return(-1);
  297. }            
  298.  
  299. /**********************************************************************************/
  300. /***               Ermittelt die Länge eines bereits geöffneten Files             ***/
  301. /**********************************************************************************/
  302.  
  303. long FileLen(FILE *fp)
  304. {
  305.     long len;
  306.     
  307.     fseek(fp,0,SEEK_END);
  308.     len=ftell(fp);
  309.     fseek(fp,0,SEEK_SET);
  310.     return(len);
  311. }
  312.  
  313. /**********************************************************************************/
  314. /***                                                                            ***/
  315. /**********************************************************************************/
  316.  
  317. void LoadBank(int banknr)
  318. {
  319.     FILE *fp,*fopen();
  320.     int i,n;
  321.     long len;
  322.     unsigned char dummy;
  323.  
  324.     SetTitle("Load bank");
  325.  
  326.     strcpy(&answer[0],filerequester(bankdir,NULL,"Load bank"));    
  327.  
  328.     if (strlen(answer) != 0)
  329.     {
  330.         i=0;
  331.         fp=fopen(answer,"r");
  332.         if (fp==NULL)
  333.         {
  334.             MyReq("Can't open file",NULL," Ok ");
  335.             goto Ende;
  336.         }
  337.         len=FileLen(fp);
  338.  
  339.         if (len==2825)
  340.         {
  341.             for (i=0;i<=7;i++) dummy=fgetc(fp);        
  342.  
  343.             for (n=0;n<=31;n++)
  344.                 for (i=0;i<=87;i++)
  345.                     s[banknr][n][i]=fgetc(fp);
  346.  
  347.             fclose(fp);
  348.             strncpy(bankname[banknr],filename,20);
  349.             goto Ende;
  350.         }
  351.  
  352.         if (len==2816)
  353.         {
  354.             for (n=0;n<=31;n++)
  355.                 for (i=0;i<=87;i++)
  356.                     s[banknr][n][i]=fgetc(fp);
  357.  
  358.             fclose(fp);
  359.             strncpy(bankname[banknr],filename,20);
  360.             goto Ende;
  361.         }
  362.         
  363.         if (len==2432 || len==2441)
  364.                 MyReq("Not K1 sound bank, seems to be a multi-patch",NULL," Ok ");
  365.         else
  366.                 MyReq("This is not a K1 single sound bank !",NULL," Ok ");
  367.     }
  368. Ende: strcpy(bankdir,ReqStruct.Dir);
  369. }
  370.  
  371. /**********************************************************************************/
  372. /***                                                                            ***/
  373. /**********************************************************************************/
  374.  
  375. void SaveBank(int banknr)
  376. {
  377.     FILE *fp,*fopen();
  378.     int i,n;
  379.  
  380.     SetTitle("Save bank");
  381.  
  382.     strcpy(&answer[0],filerequester(bankdir,bankname[banknr],"Save bank"));    
  383.  
  384.     if (strlen(answer) != 0)
  385.     {
  386.         if (Exists(answer))
  387.             if (!MyReq("File exists, overwrite it ?"," Yes "," No ")) goto Ende;
  388.  
  389.         i=0;
  390.         fp=fopen(answer,"w");
  391.         if (fp==NULL)
  392.         {
  393.             MyReq("Can't create file",NULL," Ok ");
  394.             goto Ende;
  395.         }
  396.         fputc(MS_SYSEX,fp);    fputc(0x40,fp);    fputc(0x00,fp);    fputc(0x21,fp);
  397.         fputc(0x00,fp);        fputc(0x03,fp);    fputc(0x00,fp);    fputc(0x00,fp);
  398.  
  399.         for (n=0;n<=31;n++)
  400.             for (i=0;i<=87;i++)
  401.                 fputc((int)s[banknr][n][i],fp);
  402.  
  403.         fputc(MS_EOX,fp);
  404.         fclose(fp);
  405.     }
  406.     Ende: strcpy(bankdir,ReqStruct.Dir);
  407. }
  408.  
  409. /**********************************************************************************/
  410. /***                                                                            ***/
  411. /**********************************************************************************/
  412.  
  413. void SaveSound(int soundnr)
  414. {
  415.     FILE *fp,*fopen();
  416.     char name[11];
  417.     int i;
  418.  
  419.     SetTitle("Save sound");
  420.  
  421.     for (i=0;i<=9;i++) name[i]=s[soundnr/32][soundnr%32][i];
  422.     name[10]='\0';
  423.         
  424.     strcpy(&answer[0],filerequester(sounddir,name,"Save sound"));    
  425.  
  426.     if (strlen(answer) != 0)
  427.     {
  428.         if (Exists(answer))
  429.             if (!MyReq("File exists, overwrite it ?"," Yes "," No ")) goto Ende;
  430.         
  431.         fp=fopen(answer,"w");
  432.         if (fp==NULL)
  433.         {
  434.             MyReq("Can't create file",NULL," Ok ");
  435.             goto Ende;
  436.         }
  437.  
  438.         for (i=0;i<=87;i++)    fputc((int)s[soundnr/32][soundnr%32][i],fp);
  439.         fclose(fp);
  440.     }
  441.     Ende: strcpy(sounddir,ReqStruct.Dir);
  442. }
  443.  
  444. /**********************************************************************************/
  445. /***                                                                            ***/
  446. /**********************************************************************************/
  447.  
  448. void LoadSound(int soundnr)
  449. {
  450.     FILE *fp,*fopen();
  451.     int i,notdisplay;
  452.  
  453.     SetTitle("Load sound");
  454.  
  455.     if (soundnr>=1000)
  456.     {
  457.         notdisplay=1;
  458.         soundnr-=1000;
  459.     }
  460.     else notdisplay=0;
  461.  
  462.     strcpy(&answer[0],filerequester(sounddir,NULL,"Load sound"));    
  463.  
  464.     if (strlen(answer) != 0)
  465.     {
  466.         ZZ_POINTER(win);    
  467.         fp=fopen(answer,"r");
  468.         if (fp==NULL)
  469.         {
  470.             MyReq("Can't open file",NULL," Ok ");
  471.             goto Ende;
  472.         }
  473.         if (FileLen(fp) != 88)
  474.         {
  475.             MyReq("This is not a K1 sound file",NULL," Ok ");
  476.         }
  477.         else
  478.         {
  479.             for (i=0;i<=87;i++)    s[soundnr/32][soundnr%32][i]=fgetc(fp);
  480.         }
  481.         fclose(fp);
  482.     }
  483.     Ende: if (notdisplay != 1) Display();
  484.     strcpy(sounddir,ReqStruct.Dir);
  485.     CLEAR_POINTER(win);
  486. }
  487.  
  488. /**********************************************************************************/
  489. /***                                                                            ***/
  490. /**********************************************************************************/
  491.  
  492. void SaveAllSounds(int banknr)
  493. {
  494.     FILE *fp,*fopen();
  495.     char filename[255],name[11];
  496.     int i,soundnr;
  497.  
  498.     SetTitle("Save all sounds");
  499.     ZZ_POINTER(win);
  500.     for (soundnr=0;soundnr<=31;soundnr++)
  501.     {
  502.         for (i=0;i<=9;i++) name[i]=s[banknr][soundnr][i];
  503.         name[10]='\0';
  504.         strcpy(filename,"kawai:sounds/");
  505.         strcat(filename,name);
  506.  
  507.         fp=fopen(filename,"w");
  508.         if (fp==NULL) goto Ende;
  509.         
  510.         for (i=0;i<=87;i++)    fputc((int)s[banknr][soundnr][i],fp);
  511.  
  512.         fclose(fp);
  513.         Ende: ;
  514.     }
  515.     CLEAR_POINTER(win);
  516. }
  517.  
  518. /**********************************************************************************/
  519. /***                                                                            ***/
  520. /**********************************************************************************/
  521.  
  522. void TransmitCurrentBank(int banknr)
  523. {
  524.     int n,i;
  525.     unsigned char buf[97];
  526.  
  527.     ZZ_POINTER(win);
  528.     SetTitle("Transmit current bank");
  529.  
  530.     for (n=0;n<=31;n++)
  531.     {
  532.         buf[0]=MS_SYSEX; buf[1]=0x40; buf[2]=MASTERCHANNEL; buf[3]=0x20;
  533.         buf[4]=0x00; buf[5]=0x03; buf[6]=0x00; buf[7]=n+32*banknr;
  534.  
  535.         for (i=0;i<=87;i++)    buf[8+i]=s[banknr][n][i];
  536.         buf[96]=MS_EOX;
  537.         PutMidiMsg(source,buf);
  538.     }
  539.  
  540.     ProgChange(32*banknr);
  541.     CLEAR_POINTER(win);
  542. }
  543.  
  544. /**********************************************************************************/
  545. /***                                                                            ***/
  546. /**********************************************************************************/
  547.  
  548. void TransmitBank(int banknr)
  549. {
  550.     FILE *fp,*fopen();
  551.     unsigned char buf[97];
  552.     int i,n;
  553.     long len;    
  554.  
  555.     ZZ_POINTER(win);
  556.     SetTitle("Load bank and send it to K1");
  557.  
  558.     if (MyReq("        Are you shure ?\nCurrent bank will be erased !","With pleasure !","Am I crazy ?") == FALSE) goto Ende2;
  559.  
  560.     strcpy(&answer[0],filerequester(bankdir,NULL,"Transmit bank"));    
  561.  
  562.     if (strlen(answer) != 0)
  563.     {
  564.         fp=fopen(answer,"r");
  565.         if (fp==NULL)
  566.         {
  567.             MyReq("Can't open file",NULL," Ok ");
  568.             goto Ende;
  569.         }
  570.         len=FileLen(fp);        
  571.  
  572.         if (len==2825)
  573.         {
  574.             for (i=0;i<=7;i++) n=fgetc(fp);    /* Header überlesen */
  575.             for (n=0;n<=31;n++)
  576.             {
  577.                 buf[0]=MS_SYSEX; buf[1]=0x40; buf[2]=MASTERCHANNEL; buf[3]=0x20;
  578.                 buf[4]=0x00; buf[5]=0x03; buf[6]=0x00; buf[7]=n+32*banknr;
  579.     
  580.                 for (i=0;i<=87;i++)    buf[8+i]=fgetc(fp);
  581.                 buf[96]=MS_EOX;
  582.                 PutMidiMsg(source,buf);
  583.             }
  584.             fclose(fp);
  585.             goto Ende;
  586.         }
  587.         
  588.         if (len==2816)
  589.         {
  590.             for (n=0;n<=31;n++)
  591.             {
  592.                 buf[0]=MS_SYSEX; buf[1]=0x40; buf[2]=MASTERCHANNEL; buf[3]=0x20;
  593.                 buf[4]=0x00; buf[5]=0x03; buf[6]=0x00; buf[7]=n+32*banknr;
  594.     
  595.                 for (i=0;i<=87;i++)    buf[8+i]=fgetc(fp);
  596.                 buf[96]=MS_EOX;
  597.                 PutMidiMsg(source,buf);
  598.             }
  599.             fclose(fp);
  600.             goto Ende;
  601.         }
  602.  
  603.         MyReq("This is not a K1 single sound bank !",NULL," Ok ");    
  604.     }
  605.     Ende: ;
  606.     
  607.     ProgChange(32*banknr);
  608.     strcpy(bankdir,ReqStruct.Dir);
  609.     Ende2:     CLEAR_POINTER(win);
  610. }
  611.  
  612. /**********************************************************************************/
  613. /***                                                                            ***/
  614. /**********************************************************************************/
  615.  
  616. void TransmitSingleSound(int soundnr)
  617. {
  618.     int i;
  619.     unsigned char buf[97];
  620.  
  621.     buf[0]=MS_SYSEX; buf[1]=0x40; buf[2]=MASTERCHANNEL; buf[3]=0x20;
  622.     buf[4]=0x00; buf[5]=0x03; buf[6]=0x00; buf[7]=soundnr;
  623.  
  624.     for (i=0;i<=87;i++)    buf[8+i]=s[soundnr/32][soundnr%32][i];
  625.     buf[96]=MS_EOX;
  626.     PutMidiMsg(source,buf);
  627.     Delay(1);
  628.  
  629.     ProgChange(soundnr);
  630. }
  631.  
  632. /**********************************************************************************/
  633. /***                             Bank vom K1 anfordern                                ***/
  634. /**********************************************************************************/
  635.  
  636. void GetBank(int banknr)
  637. {
  638.     UBYTE *msg,buf[9],d[2600];
  639.     int i,n,fo,chn;
  640.     FILE *fp,*fopen();
  641.  
  642.     MASTERCHANNEL=chn=WaitForK1();
  643.     if (chn == -1)
  644.     {
  645.         i=MyReq("Error: K1 not present",NULL," Ok ");
  646.         goto Ende;
  647.     }
  648.  
  649.     SetTitle("Get bank from K1");
  650.  
  651. Loop: ZZ_POINTER(win);
  652.     fo=creat("ram:k1-bank",0666);
  653.     if (fo != -1)
  654.     {
  655.         buf[0]=0xf0;    buf[1]=0x40;
  656.         buf[2]=chn;     buf[3]=0x01;
  657.         buf[4]=0x00;    buf[5]=0x03;
  658.         buf[6]=0x00;    buf[7]=32*(banknr%2);
  659.         buf[8]=0xf7;
  660.         PutMidiMsg(source,buf);
  661.         Delay(3);            
  662.  
  663.         WaitPort(dest->DestPort);
  664.         if (packet = GetMidiPacket(dest)) 
  665.         {
  666.             if (write(fo,packet->MidiMsg,packet->Length) != packet->Length); 
  667.         }
  668.         close(fo);
  669.         
  670.         if (packet->Length == 2825)
  671.         {
  672.             fp=fopen("ram:k1-bank","r");
  673.             for (i=0;i<=7;i++) n=fgetc(fp);        /* Midi-Header überlesen */
  674.             for (n=0;n<=31;n++)
  675.             {
  676.                 for (i=0;i<=87;i++)    s[banknr][n][i]=fgetc(fp);
  677.             }
  678.             strcpy(bankname[banknr],"");
  679.             fclose(fp);
  680.         }
  681.         else goto Loop;
  682.         DeleteFile("ram:k1-bank");
  683.         FreeMidiPacket(packet);
  684.     }
  685.     else
  686.     {
  687.         MyReq("Can't create temporary file in RAM-Disk",NULL," Ok ");    
  688.     }
  689.     Ende: CLEAR_POINTER(win);
  690. }
  691.  
  692. /**********************************************************************************/
  693. /***                            Laden eines Multi-Patches                          ***/
  694. /**********************************************************************************/
  695.  
  696. void LoadMulti(void)
  697. {
  698.     FILE *fp,*fopen();
  699.     int i,n;
  700.     long len;
  701.  
  702.     SetTitle("Load multi-patch");
  703.  
  704.     strcpy(&answer[0],filerequester(multidir,NULL,"Load multi"));    
  705.  
  706.     if (strlen(answer) != 0)
  707.     {
  708.         i=0;
  709.         fp=fopen(answer,"r");
  710.         if (fp==NULL)
  711.         {
  712.             MyReq("Can't open file",NULL," Ok ");
  713.             goto Ende;
  714.         }
  715.         len=FileLen(fp);
  716.  
  717.         if (len==2432)
  718.         {
  719.             for (n=0;n<=31;n++)
  720.             {
  721.                 for (i=0; i<=75; i++)
  722.                 {
  723.                     m[n][i]=fgetc(fp);
  724.                 }
  725.             }
  726.             strcpy(multiname,filename);
  727.             fclose(fp);
  728.             goto Ende;
  729.         }
  730.     
  731.         if (len==2441)
  732.         {
  733.             for (i=0;i<=7;i++) n=fgetc(fp); 
  734.  
  735.             for (n=0;n<=31;n++)
  736.                 for (i=0; i<=75; i++)
  737.                     m[n][i]=fgetc(fp);
  738.  
  739.             strcpy(multiname,filename);
  740.             fclose(fp);
  741.             goto Ende;
  742.         }
  743.         
  744.         MyReq("Sorry, this is not a K1 multi-patch",NULL," Ok ");
  745.         fclose(fp);    
  746.     }
  747. Ende:     Display();
  748.     strcpy(multidir,ReqStruct.Dir);
  749. }
  750.  
  751. /**********************************************************************************/
  752. /***                    Saven eines Multi-Patches                               ***/
  753. /**********************************************************************************/
  754.  
  755. void SaveMulti(void)
  756. {
  757.     FILE *fp,*fopen();
  758.     int i,n;
  759.  
  760.     SetTitle("Save multi-patch");
  761.  
  762.     strcpy(&answer[0],filerequester(multidir,multiname,"Save multi"));    
  763.  
  764.     if (strlen(answer) != 0)
  765.     {
  766.         if (Exists(answer))
  767.             if (!MyReq("File exists, overwrite it ?"," Yes "," No ")) goto Ende;
  768.  
  769.         i=0;
  770.         fp=fopen(answer,"w");
  771.         if (fp==NULL)
  772.         {
  773.             MyReq("Can't create file",NULL," Ok ");
  774.             goto Ende;
  775.         }
  776.  
  777.         for (n=0;n<=31;n++)
  778.             for (i=0;i<=75;i++)
  779.                 fputc((int)m[n][i],fp);
  780.  
  781.         fclose(fp);
  782.     }
  783.     Ende: strcpy(multidir,ReqStruct.Dir);
  784. }
  785.  
  786. /**********************************************************************************/
  787. /***                                                                            ***/
  788. /**********************************************************************************/
  789.  
  790. void SendDump(void)
  791. {
  792.     unsigned char buf[90];
  793.  
  794.     SetTitle("Send dump to K1");
  795.  
  796.     TransmitCurrentBank(0);
  797.     TransmitCurrentBank(1);
  798.     SendMulti();
  799. }
  800.  
  801. /**********************************************************************************/
  802. /***                     Multipatch von K1 holen                                 ***/
  803. /**********************************************************************************/
  804.  
  805. void GetDump(void)
  806. {
  807.     SetTitle("Get dump from K1");
  808.     
  809.     GetBank(0); Delay(2);
  810.     GetBank(1); Delay(2);
  811.     GetMulti(); Delay(2);
  812. }
  813.  
  814. /**********************************************************************************/
  815. /***                                                                            ***/
  816. /**********************************************************************************/
  817.  
  818. void TransmitSingleMulti(int soundnr)
  819. {
  820.     int i;
  821.     unsigned char buf[97];
  822.  
  823.     buf[0]=MS_SYSEX; buf[1]=0x40; buf[2]=MASTERCHANNEL; buf[3]=0x20;
  824.     buf[4]=0x00; buf[5]=0x03; buf[6]=0x00; buf[7]=64+soundnr;
  825.  
  826.     for (i=0;i<=75;i++)    buf[8+i]=m[soundnr][i];
  827.     buf[84]=MS_EOX;
  828.     PutMidiMsg(source,buf);
  829.     Delay(2);
  830.  
  831.     ProgChange(64+soundnr);
  832. }
  833.  
  834. /**********************************************************************************/
  835. /***                                                                            ***/
  836. /**********************************************************************************/
  837.  
  838. void LoadDump(char *dumpname)
  839. {
  840.     FILE *fp,*fopen();
  841.     int i,n;
  842.     long len;
  843.     unsigned char dummy;
  844.     char string[255];
  845.  
  846.     SetTitle("Load dump");
  847.  
  848.     if (dumpname != NULL)
  849.     {
  850.         strcpy(string,dumpdir);
  851.         strcat(string,dumpname);
  852.         strcpy(answer,string);
  853.         goto Load;
  854.     }
  855.  
  856.     strcpy(answer,filerequester(dumpdir,NULL,"Load dump"));    
  857.  
  858.     if (strlen(answer) != 0)
  859.     {
  860. Load:    fp=fopen(answer,"r");
  861.         len=FileLen(fp);
  862.  
  863.         if (len==8082)
  864.         {
  865.             for (n=0;n<=31;n++)                        /* 1. Bank lesen */            
  866.                 for (i=0;i<=87;i++)
  867.                     s[0][n][i]=fgetc(fp);
  868.  
  869.             for (n=0;n<=31;n++)                     /* 1. Bank lesen */            
  870.                 for (i=0;i<=87;i++)
  871.                     s[1][n][i]=fgetc(fp);
  872.             
  873.             for (i=0;i<=17;i++) n=fgetc(fp);        /* Lücke überlesen */
  874.  
  875.             for (n=0;n<=31;n++)
  876.                 for (i=0;i<=75;i++)
  877.                     m[n][i]=fgetc(fp);
  878.  
  879.             fclose(fp);
  880.             goto Ende;
  881.         }
  882.         else MyReq("This is not a K1 dump file",NULL," Ok ");    
  883.     }
  884.  
  885. Ende: Display();
  886.     strcpy(bankname[0],"");
  887.     strcpy(bankname[1],"");
  888.     strcpy(multiname,"");
  889.     if (ReqStruct.Dir) strcpy(dumpdir,ReqStruct.Dir);
  890. }
  891.  
  892. /**********************************************************************************/
  893. /***                                                                            ***/
  894. /**********************************************************    ************************/
  895.  
  896. void SaveDump(void)
  897. {
  898.     FILE *fp,*fopen();
  899.     int i,n;
  900.  
  901.     SetTitle("Save dump");
  902.  
  903.     strcpy(&answer[0],filerequester(dumpdir,NULL,"Save dump"));    
  904.  
  905.     if (strlen(answer) != 0)
  906.     {
  907.         if (Exists(answer))
  908.             if (!MyReq("File exists, overwrite it ?"," Yes "," No ")) goto Ende;
  909.  
  910.         i=0;
  911.         fp=fopen(answer,"w");
  912.         if (fp==NULL)
  913.         {
  914.             ("Can't create file");
  915.             goto Ende;
  916.         }
  917.  
  918.         for (n=0;n<=31;n++)                        /* 1. Bank */
  919.             for (i=0;i<=87;i++)
  920.                 fputc((int)s[0][n][i],fp);
  921.  
  922.         for (n=0;n<=31;n++)                        /* 2. Bank */
  923.             for (i=0;i<=87;i++)
  924.                 fputc((int)s[1][n][i],fp);
  925.  
  926.         for (i=0;i<=17;i++) fputc((int)0,fp);    /* Lücke auffüllen */
  927.  
  928.         for (n=0;n<=31;n++)                        /* Multi-Bank */
  929.             for (i=0;i<=75;i++)
  930.                 fputc((int)m[n][i],fp);
  931.  
  932.         fclose(fp);
  933.     }
  934.     Ende: 
  935.     if (ReqStruct.Dir) strcpy(dumpdir,ReqStruct.Dir);
  936. }
  937.  
  938.  
  939. /**********************************************************************************/
  940. /***                                                                            ***/
  941. /**********************************************************************************/
  942.  
  943. void Display(void)
  944. {
  945.     if (multi==0) DisplayBank();
  946.             else  DisplayMulti();
  947. }
  948.  
  949. /**********************************************************************************/
  950. /***                                                                            ***/
  951. /**********************************************************************************/
  952.  
  953. void GetMulti(void)
  954. {
  955.     UBYTE *msg,buf[9],d[2600];
  956.     int i,n,fo,chn;
  957.     FILE *fp,*fopen();
  958.  
  959.     ZZ_POINTER(win);
  960.     MASTERCHANNEL=chn=WaitForK1();    
  961.     if (chn == -1)
  962.     {
  963.         i=MyReq("Error: K1 not present",NULL," Ok ");
  964.         goto Ende;
  965.     }
  966.  
  967.     SetTitle("Get multi-patch from K1");
  968.  
  969. Loop: ;
  970.     fo=creat("ram:k1-bank",0666);
  971.     if (fo != -1)
  972.     {
  973.         buf[0]=0xf0;    buf[1]=0x40;
  974.         buf[2]=chn;        buf[3]=0x01;
  975.         buf[4]=0x00;    buf[5]=0x03;
  976.         buf[6]=0x00;    buf[7]=64;
  977.         buf[8]=0xf7;
  978.         PutMidiMsg(source,buf);
  979.         Delay(5);
  980.  
  981.         WaitPort(dest->DestPort);
  982.         if (packet = GetMidiPacket(dest)) 
  983.         {
  984.             if (write(fo,packet->MidiMsg,packet->Length) != packet->Length); 
  985.         }
  986.         close(fo);
  987.         
  988.         if (packet->Length == 2441)
  989.         {
  990.             fp=fopen("ram:k1-bank","r");
  991.             for (i=0;i<=7;i++) n=fgetc(fp);        /* Midi-Header überlesen */
  992.  
  993.             for (n=0;n<=31;n++)
  994.                 for (i=0;i<=75;i++)
  995.                     m[n][i]=fgetc(fp);
  996.  
  997.             strcpy(multiname,"");
  998.             fclose(fp);
  999.         }
  1000.         else goto Loop;
  1001.         DeleteFile("ram:k1-bank");
  1002.         FreeMidiPacket(packet);
  1003.     }
  1004.     else
  1005.     {
  1006.         MyReq("Can't create temporary file in RAM-Disk",NULL," Ok ");    
  1007.     }
  1008.     Ende: CLEAR_POINTER(win);
  1009. }
  1010.  
  1011. /**********************************************************************************/
  1012. /***                                                                            ***/
  1013. /**********************************************************************************/
  1014.  
  1015. void SendMulti(void)
  1016. {
  1017.     int i,n;
  1018.     unsigned char buf[97];
  1019.  
  1020.     SetTitle("Send multi-patch to K1");
  1021.  
  1022.     ZZ_POINTER(win);
  1023.     for (n=0;n<=31;n++) 
  1024.     {
  1025.         buf[0]=MS_SYSEX; buf[1]=0x40; buf[2]=MASTERCHANNEL; buf[3]=0x20;
  1026.         buf[4]=0x00; buf[5]=0x03; buf[6]=0x00; buf[7]=64+n;
  1027.  
  1028.         for (i=0;i<=75;i++)    buf[8+i]=m[n][i];
  1029.         buf[84]=MS_EOX;
  1030.         PutMidiMsg(source,buf);
  1031.         Delay(1);
  1032.     }
  1033.     Delay(5);
  1034.  
  1035.     ProgChange(64);
  1036.  
  1037.     CLEAR_POINTER(win);
  1038. }
  1039.  
  1040. /**********************************************************************************/
  1041. /***                                                                            ***/
  1042. /**********************************************************************************/
  1043.  
  1044. void ProgChange(int nr)
  1045. {
  1046.     unsigned char buf[2];
  1047.  
  1048.     if (nr>=64 && nr<96)
  1049.     {
  1050.         buf[0]=192+MASTERCHANNEL;
  1051.         buf[1]=nr-1;
  1052.         PutMidiMsg(source,buf);
  1053.         Delay(2);    
  1054.     }
  1055.  
  1056.     if (nr<64)
  1057.     {
  1058.         buf[0]=192+MASTERCHANNEL;
  1059.         buf[1]=nr+1;
  1060.         PutMidiMsg(source,buf);
  1061.         Delay(2);    
  1062.     }
  1063.  
  1064.     buf[0]=192+MASTERCHANNEL;
  1065.     buf[1]=nr;
  1066.     PutMidiMsg(source,buf);
  1067.     Delay(2);    
  1068. }
  1069.  
  1070. /**********************************************************************************/
  1071. /***                                                                            ***/
  1072. /**********************************************************************************/
  1073.  
  1074. void NoteOn(int note,int vel,int channel)
  1075. {
  1076.     UBYTE buf[3];
  1077.  
  1078.     buf[0] = MS_NOTEON | channel;
  1079.     buf[1] = note;
  1080.     buf[2] = vel;
  1081.     PutMidiMsg(source,buf);
  1082. }
  1083.  
  1084. /**********************************************************************************/
  1085. /***                                                                            ***/
  1086. /**********************************************************************************/
  1087.  
  1088. void NoteOff(int note,int channel)        
  1089. {    
  1090.     UBYTE buf[3];
  1091.  
  1092.     buf[0] = MS_NOTEOFF | channel;
  1093.     buf[1] = note;
  1094.     buf[2] = 64;
  1095.     PutMidiMsg(source,buf);
  1096. }
  1097.  
  1098. /**********************************************************************************/
  1099. /***                                                                            ***/
  1100. /**********************************************************************************/
  1101.  
  1102. void AllNotesOff(void)            
  1103. {
  1104.     UBYTE buf[3];
  1105.  
  1106.     buf[0] = MS_MODE | MASTERCHANNEL;
  1107.     buf[1] = MM_ALLOFF;        
  1108.     buf[2] = 0;
  1109.     PutMidiMsg(source,buf);    
  1110. }
  1111.  
  1112. /**********************************************************************************/
  1113. /***                                                                            ***/
  1114. /**********************************************************************************/
  1115.  
  1116. BOOL Exists(char *file)
  1117. {
  1118.     struct Lock *lock;
  1119.  
  1120.     lock=Lock(file,ACCESS_READ);
  1121.     if (lock==NULL)     return(FALSE);
  1122.     UnLock(lock);
  1123.     return(TRUE);    
  1124. }
  1125.  
  1126. /**********************************************************************************/
  1127. /***                                                                            ***/
  1128. /**********************************************************************************/
  1129.  
  1130. void Unkown(void)
  1131. {
  1132.     char str[]={0x44,0x65,0x64,0x69,0x63,0x61,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x44,0x6f,0x72,0x6f,0x74,0x68,0x65,0x65,00};
  1133. }
  1134.  
  1135. /**********************************************************************************/
  1136. /***                                                                            ***/
  1137. /**********************************************************************************/
  1138.  
  1139. char *filerequester(char *dir,char *filename,char *title)
  1140. {
  1141.     char answer[255];    
  1142.     
  1143.     if (dir==NULL)         dir        =(char *)"";
  1144.     if (filename==NULL) filename=(char *)"";
  1145.  
  1146.     answer[0] = 0;
  1147.  
  1148.     ReqStruct.PathName         = answer;
  1149.     ReqStruct.Dir             = dir;
  1150.     ReqStruct.File             = filename;
  1151.     ReqStruct.Title         = title;
  1152.     ReqStruct.VersionNumber =REQVERSION;
  1153.     ReqStruct.Flags         = FRQCACHINGM+(SCREEN != NULL ? FRQNODRAGM : NULL);
  1154.  
  1155.     if (FileRequester(&ReqStruct)) return(&answer[0]);
  1156.                             else   return((char *)"");
  1157. }